package com.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5加密工具
 * @author dell
 *
 */
public class MD5Util {
	public static String getMD5Str(String str) {   
        MessageDigest messageDigest = null;   
   
        try {   
            messageDigest = MessageDigest.getInstance("MD5");   
   
            messageDigest.reset();   
   
            messageDigest.update(str.getBytes("UTF-8"));   
        } catch (NoSuchAlgorithmException e) {   
            System.out.println("NoSuchAlgorithmException caught!");   
            System.exit(-1);   
        } catch (UnsupportedEncodingException e) {   
            e.printStackTrace();   
        }   
   
        byte[] byteArray = messageDigest.digest();   
   
        StringBuffer md5StrBuff = new StringBuffer();   
   
        for (int i = 0; i < byteArray.length; i++) {               
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)   
                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));   
            else   
                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));   
        }   
   
        return md5StrBuff.toString().toUpperCase();   
    } 
	
	protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };   
    protected static MessageDigest messagedigest = null;   
    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");   
        } catch (NoSuchAlgorithmException e) {   
            e.printStackTrace();   
        }   
    }   
  
    public static void main(String[] args) throws IOException {   
    	long start = System.currentTimeMillis();
        File file = new File("D:\\Javatools\\apache-tomcat-6.0.26\\apache-tomcat-6.0.26\\webapps\\XiorkFlow\\processes\\复件 default.xml");  
        File file1 = new File("C:\\checktest\\down2\\复件 default.xml");   
        String md5 = getFileMD5String(file);   
        String md51 = getFileMD5String(file1);  
        System.out.println("md5:" + md5);  
        System.out.println("md51:" + md51);   
        long end = System.currentTimeMillis();
        System.out.println("c==="+(end-start));
        String md5str = getMD5Str("123456");
		System.out.println("md5str====="+md5str);
    }   
  
    public static String getFileMD5String(File file) throws IOException {   
        InputStream fis;   
        fis = new FileInputStream(file);   
        byte[] buffer = new byte[3024];   
        int numRead = 0;   
        while ((numRead = fis.read(buffer)) > 0) {   
            messagedigest.update(buffer, 0, numRead);   
        }   
        fis.close();   
        return bufferToHex(messagedigest.digest());   
    }   
  
    private static String bufferToHex(byte bytes[]) {   
        return bufferToHex(bytes, 0, bytes.length);   
    }   
  
    private static String bufferToHex(byte bytes[], int m, int n) {   
        StringBuffer stringbuffer = new StringBuffer(2 * n);   
        int k = m + n;   
        for (int l = m; l < k; l++) {   
            appendHexPair(bytes[l], stringbuffer);   
        }   
        return stringbuffer.toString();   
    }   
  
    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {   
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换   
        // 为逻辑右移，将符号位一起右移,此处未发现两种符号有何不同   
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换   
        stringbuffer.append(c0);   
        stringbuffer.append(c1);   
    }   
	
}
